

//#include "dev_battery.h"


#ifndef __DEV_BATTERY_H__
#define __DEV_BATTERY_H__

#include "dev_module.h"
#include "iot_message.pb.h"
#include <stdint.h>
#include "iot_node.h"




#define  battery_max_scale_0_01mm   (100000U)    //1000mm===1000x100 (0.01mm)
#define  battery_max_dev_addr        (245U)      // 烟雾设备地址	R/W	否	配置参数	uint8_t	0~255
#define  battery_max_channel          (31U)      // 烟雾设备通道编号	R/W	否	配置参数	uint8_t	0~31


#define  battery_RO_run_param_of_node_iot_id_begin          (43521U)   //43521	volt1	单体电压1	RO
//#define  battery_RO_run_param_of_node_iot_id_end            (45449U)   //45449	firstCap299n300	初始容量300--ver.<<蓄电池传感器物模型-v1.6>>
#define  battery_RO_run_param_of_node_iot_id_end            (45700U)   //B284	45700	firstCap300	初始容量300	RO--ver.<<蓄电池传感器物模型-v1.7>>




/*-----------------------------------------------------------------------------------------------							
0x0801	软件版本	RO	否	软件版本	string	最大32字节			
0x0802	硬件版本	RO	否	硬件版本	string	最大32字节			
0x0803	产品型号	RO	否	产品型号	string	最大32字节			
0x0804	生产信息	RO	否	生产信息	string	最大32字节			生产日期，生产批次等信息
0x0805	厂家信息	RO	否		string	最大32字节			生产商名称信息

-----------------------------------------------------------------------------------------*/

/////-----设备类型----
//#define   DEV_BATTERY_TYPE     (0xD006)     //烟雾传感器（D006H） 



////以下枚举的取值 需要结合 数组 battery_iot_id_table[battery_index_end]的下标进行关联的定义---同步更新----
// typedef enum{
//     battery_index_run_data_begin      = 0,    // 设备运行参数
//     battery_index_config_data_begin   = 8,    // 设备配置参数-------------超过 8个时需要分帧处理
//     battery_index_factory_info_begin  = 16,   // 设备出厂信息
//     battery_index_end = 20+1,
// } battery_attr_index_e;


typedef enum{
    battery_index_run_data_begin      = 0,    // 设备运行参数
    battery_index_run_data_end        = 25,    // 设备运行参数-------------超过 8个时需要分帧处理
    battery_index_config_data_begin   = 25,     // 设备配置参数-
   // battery_index_factory_info_begin  = 55,   // 设备出厂信息   ----78  溢出了----这个需要改pb文件
     battery_index_factory_info_begin  = 80,   // 设备出厂信息   ----78  溢出了----这个需要改pb文件   
    battery_index_end = battery_index_factory_info_begin+5,
} battery_attr_index_e;

// typedef enum{
//     battery_index_run_data_begin      = 0,    // 设备运行参数
//     battery_index_config_data_begin   = 19,    // 设备配置参数-------------超过 8个时需要分帧处理
//     battery_index_factory_info_begin  = 51,   // 设备出厂信息19+32
//     battery_index_end = 51+5+1,
// } battery_attr_index_e;




//#define  battery_iot_id_key_name_table_end  (78u)  //担心socket缓冲区溢出
#define  battery_iot_id_key_name_table_end  (53u)  //担心socket缓冲区溢出---暂时定义53


extern const dev_attr_key_name_t  battery_iot_id_key_name_table[battery_iot_id_key_name_table_end];



#pragma pack(1)

//0x0500	烟雾报警信息 "0=正常，1=告警
typedef union{
    struct{
        uint32_t en :  1;      // 报警使能
        uint32_t res1:31;
    }bit;
    uint32_t value;
} battery_alarm_u;


//烟雾传感器（D006H）的数据
///---------RO 数据--------//
typedef struct{

//    battery_alarm_u  alarm;   //0x0500	烟雾报警信息"0=正常，1=告警
                             //bit0：烟雾报警
////---蓄电池传感器物模型-v1.6--------------------------------
    uint16_t    battAlmTotal;// FE2	4066		电池报警状态汇总	RO		运行参数	uint16_t	所有电池报警状态汇总,有任意一节或一节以上报警,此寄存器相应位即置位.
////---蓄电池传感器物模型-v1.6--------------------------------

    uint16_t	groupVolt	;//	110F	4367	组压	RO		运行参数	uint16_t---0.1V		电池组实时总电压，取1位小数点，单位：V
    uint16_t	chargeCurr	;//	1110	4368	充放电电流	RO		运行参数	uint16_t
    uint16_t	chargeCurrComp	;//	1111	4369	充放电电流补码	-----------------0.01A-----取2位小数点，单位：A。 正数充电， 负数放电			
    uint16_t	floatChargeCurr	;//	1112	4370	浮充电流	RO		运行参数	uint16_t----取2位小数点，单位：A
    uint16_t	envTempe1	;//	1113	4371	环境温度1	RO		运行参数	uint16_t
    uint16_t	envTempe2	;//	1114	4372	环境温度2	RO		运行参数	uint16_t
    uint16_t	maxVoltBattNo;//	1115	4373	最高电压电池号	RO		运行参数	uint16_t
    uint16_t	minVoltBattNo;//	1116	4374	最低电压电池号	RO		运行参数	uint16_t
    uint16_t	maxResBattNo;//	1117	4375	最高内阻电池号	RO		运行参数	uint16_t
    uint16_t	averageDifference	;//	1118	4376	均差值	RO		运行参数	uint16_t
    uint16_t	poleDifference	;//	1119	4377	极差值	RO		运行参数	uint16_t
    uint16_t	minRestCap	;//	111A	4378	按最低电池容量整组剩余容量	RO		运行参数	uint16_t
    uint16_t	minRestLoadTime	;//	111B	4379	按最低电池容量整组带载时间	RO		运行参数	uint16_t
    uint16_t	restCap	;//	111C	4380	按组压整组剩余容量	RO		运行参数	uint16_t   1%
    uint16_t	restLoadTime	;//	111D	4381	按组压整组带载时间	RO		运行参数	uint16_t-------分钟
    uint16_t	chargeStatus	;//	111E	4382	电池组充放电状态	RO		运行参数	uint16_t-----0:浮充，1：放电，2：充电		
    uint16_t	groupAlm	;//	111F	4383	整组电池测量量报警状态	RO		运行参数	uint16_t
    uint16_t	rippleWave	;//	1121	4385	纹波	RO		运行参数	uint16_t
    uint16_t	hydrogenContent	;//	1122	4386	氢气含量	RO		运行参数	uint16_t
                    
    uint16_t	extAlm	;//	1124	4388	扩展测量量报警状态	RO		运行参数	uint16_t

//--------蓄电池传感器物模型-v1.3-----------
    uint16_t    cellVoltMax;//    7530	30000	cellVoltMax	最高电池电压	RO		运行参数	uint16_t		mV
    uint16_t    cellVoltMin;//    7531	30001	cellVoltMin	最低电池电压	RO		运行参数	uint16_t		mV
    uint16_t    cellResMax;//    7532	30002	cellResMax	最高电池内阻	RO		运行参数	uint16_t		微欧
    uint16_t	tempeCellMax;// 7533	30003   tempeCellMax 最高电池温度	RO		运行参数			0.1度


} battery_data_t;

///---------R/W	配置参数--------//
typedef struct{

    uint8_t   addr;              //烟雾设备地址  0~255			
    uint8_t   channel;           //0x0602	烟雾设备通道编号	0~31	
				
    uint16_t	battNum	;//	1127	4391	电池数量	R/W		配置参数	uint16_t
    uint16_t	comParam1	;//	1128	4392	com 电池串参数传感器映射参数1	R/W		配置参数	uint16_t
    uint16_t	addr1	;//	1129	4393	addr1	R/W		配置参数	uint16_t
    uint16_t	num1	;//	112A	4394	num1	R/W		配置参数	uint16_t
    uint16_t	comParam2	;//	112B	4395	com 电池串参数传感器映射参数2	R/W		配置参数	uint16_t
    uint16_t	addr2	;//	112C	4396	addr2	R/W		配置参数	uint16_t
    uint16_t	num2	;//	112D	4397	num2	R/W		配置参数	uint16_t
    uint16_t	battScurrparam	;//	112E	4398	com;      //电池串电流映射参数	R/W		配置参数	uint16_t
    uint16_t	currAddr	;//	112F	4399	addr;	R/W		配置参数	uint16_t
    uint16_t	currnum	;//	1130	4400	currnum;	R/W		配置参数	uint16_t
    uint16_t	volcin	;//	1131	4401	volcom;   //电池串电压映射参数	R/W		配置参数	uint16_t
    uint16_t	laddr	;//	1132	4402	laddr;	R/W		配置参数	uint16_t
    uint16_t	lnum	;//	1133	4403	num;	R/W		配置参数	uint16_t
    uint16_t	battType	;//	1134	4404	电池类型2\6\12	R/W		配置参数	uint16_t
    uint16_t	battModuleTupe	;//	1135	4405	电池模块类型	R/W		配置参数	uint16_t
    uint16_t	battRateCap	;//	1136	4406	电池额定容量	R/W		配置参数	uint16_t
    uint16_t	battStdRes	;//	1137	4407	电池标准内阻	R/W		配置参数	uint16_t
                    
    uint16_t	maxBattVolt	;//	1139	4409	电池电压上限	R/W		配置参数	uint16_t
    uint16_t	minBattVolt	;//	113A	4410	电池电压下限	R/W		配置参数	uint16_t
    uint16_t	maxBattTempe	;//	113B	4411	电池温度上限	R/W		配置参数	uint16_t
    uint16_t	minBattTempe	;//	113C	4412	电池温度下限	R/W		配置参数	uint16_t
    uint16_t	maxBattRes	;//	113D	4413	电池内阻上限	R/W		配置参数	uint16_t
    uint16_t	minBattRes	;//	113E	4414	电池内阻下限	R/W		配置参数	uint16_t
    uint16_t	minBattCap	;//	113F	4415	电池容量下限	R/W		配置参数	uint16_t
    uint16_t	maxBattVoltDiff	;//	1140	4416	电池电压差上限	R/W		配置参数	uint16_t
    uint16_t	maxDischargeCurr	;//	1141	4417	放电电流上限	R/W		配置参数	uint16_t
    uint16_t	dischargeCurrTh	;//	1142	4418	放电电流门槛	R/W		配置参数	uint16_t
    uint16_t	maxChargeCurr	;//	1143	4419	充电电流上限	R/W		配置参数	uint16_t
    uint16_t	minChargeCurr	;//	1144	4420	充电电流下限	R/W		配置参数	uint16_t
    uint16_t	maxFloatChargeCurr	;//	1145	4421	浮充电流上限	R/W		配置参数	uint16_t
    uint16_t	maxGroupVolt	;//	1146	4422	电池组电压上限	R/W		配置参数	uint16_t
    uint16_t	minGroupVolt	;//	1147	4423	电池组电压下限	R/W		配置参数	uint16_t
    uint16_t	maxRippleWave	;//	1148	4424	电池组文波上限	R/W		配置参数	uint16_t
    uint16_t	battResFactor	;//	1149	4425	电池组内阻系数	R/W		配置参数	uint16_t
    uint16_t	resChangeCtrl	;//	114A	4426	电池内阻缓变控制	R/W		配置参数	uint16_t
    uint16_t	resChangeFactor	;//	114B	4427	电池内阻缓变系数	R/W		配置参数	uint16_t
    uint16_t	resOffset	;//	114C	4428	电池内阻偏移量	R/W		配置参数	uint16_t
    uint16_t	rateLoadCurrProportion	;//	114D	4429	额定负载电流比	R/W		配置参数	uint16_t
    uint16_t	openCircuitFactro	;//	114E	4430	开路判别系数	R/W		配置参数	uint16_t


    int16_t	wrProtect	;//	1151	4433	写保护	R/W		配置参数
    int16_t	resetBattMDev	;//	1152	4434	复位装置	R/W		配置参数
    int16_t	wrSysCfg	;//	1153	4435	应用写定值	R/W		配置参数	
    int8_t	almCtrl	;//	1155	4437	告警启停	R/W		配置参数
    uint16_t	stationType	;//	1156	4438	站点类型	R/W		配置参数
    int8_t	  battSerialNum	;//	1157	4439	电池串数	R/W		配置参数
    uint16_t	stdSampleInterval	;//	1158	4440	正常采样间隔	R/W		配置参数
    uint16_t	chargeSampleInterval	;//	1159	4441	充放电采样间隔	R/W		配置参数
    uint16_t	voltSampleInterval	;//	115A	4442	总电压电流温度采样间隔	R/W		配置参数
    uint16_t	balanceCtrl	;//	115B	4443	均衡控制	R/W		配置参数
    uint16_t	checkRes	;//	115C	4444	手动测内阻	R/W		配置参数
    uint16_t	resetCfg	;//	115D	4445	恢复出厂设置	R/W		配置参数
    uint16_t	restoreCfg	;//	115E	4446	恢复保存设置	R/W		配置参数
    uint16_t	saveCfg	;//	115F	4447	保存现有设置	R/W		配置参数
    uint16_t	version	;//	1160	4448	版本号	R/W		配置参数
////------------------------------
    uint16_t	voltSensorNumCom1	;//	1163	4451	COM1口组电压传感器数	R/W
    uint16_t	currSensorNum1om1	;//	1164	4452	COM1口组电流传感器数	R/W
    uint16_t	paramSensorNumCom1	;//	1165	4453	COM1口参数传感器数	R/W
    uint16_t	sensorTypeCom1	;//	1166	4454	COM1口传感器类型1.单电压。2带内阻	R/W
    uint16_t	balancevoltCom1	;//	1167	4455	COM1口通信口均衡电压	R/W
    uint16_t	voltSensorNumCom2	;//	1168	4456	COM2口组电压传感器数	R/W
    uint16_t	currSensorNum1om2	;//	1169	4457	COM2口组电流传感器数	R/W
    uint16_t	paramSensorNumCom2	;//	116A	4458	COM2口参数传感器数	R/W
    uint16_t	sensorTypeCom2	;//	116B	4459	COM2口传感器类型1.单电压。2带内阻	R/W
    uint16_t	balancevoltCom2	;//	116C	4460	COM2口通信口均衡电压	R/W
    uint16_t	voltSensorNumCom3	;//	116D	4461	COM3口组电压传感器数	R/W
    uint16_t	currSensorNum1om3	;//	116E	4462	COM3口组电流传感器数	R/W
    uint16_t	paramSensorNumCom3	;//	116F	4463	COM3口参数传感器数	R/W
    uint16_t	sensorTypeCom3	;//	1170	4464	COM3口传感器类型1.单电压。2带内阻	R/W
    uint16_t	balancevoltCom3	;//	1171	4465	COM3口通信口均衡电压	R/W
    uint16_t	voltSensorNumCom4	;//	1172	4466	COM4口组电压传感器数	R/W
    uint16_t	currSensorNum1om4	;//	1173	4467	COM4口组电流传感器数	R/W
    uint16_t	paramSensorNumCom4	;//	1174	4468	COM4口参数传感器数	R/W
    uint16_t	sensorTypeCom4	;//	1175	4469	COM4口传感器类型1.单电压。2带内阻	R/W
    uint16_t	balancevoltCom4	;//	1176	4470	COM4口通信口均衡电压	R/W
    uint16_t	paramSensorAddrCom1	;//	1177	4471	COM1口参数传感器起始地址	R/W
    uint16_t	paramSensorAddrCom2	;//	1178	4472	COM2口参数传感器起始地址	R/W
    uint16_t	paramSensorAddrCom3	;//	1179	4473	COM3口参数传感器起始地址	R/W
    uint16_t	paramSensorAddrCom4	;//	117A	4474	COM4口参数传感器起始地址	R/W

} battery_config_t;




//---配置节点信息----------


typedef union
{
	struct{	
		
	  uint16_t online                  :1;	  //节点在线标志-----1:在线，0:离线，

	  uint16_t res                     :15;  
		
	}bit;
	
  uint16_t all;

} battery_node_flags_u;




/*  ----------------------- --------------------------
typedef struct{

    char soft_ver[33];
    char hard_ver[33];
    char product_model[33];     //0x0803	产品型号

    char production_info[33];        //生产信息----生产日期，生产批次等信息
    char manufacturer[33];      //0x0805	厂家信息- 最大32字节 生产商名称信息----manufacturer--factory--producer---

} battery_info_t;

----------------------- --------------------------*/

// typedef enum{

//     index_1,    //
//     index_max,

// } battery_index_e;


//#define   BATTERY_NODE_NUM_MAX    (255U)  
#define   BATTERY_NODE_NUM_MAX    (NODE_NUM_MAX)     ///与配置节点总数相关-----



typedef struct{
    battery_data_t      data;
    battery_config_t    config;
    dev_attr_com_info_t  info;
    battery_node_flags_u  flags;
 //   char   dev_name_str[32];   
} battery_attr_t;


#pragma pack()

extern const  uint16_t  battery_iot_id_table[battery_index_end];

/**
 * @brief 
 * 
 */
void battery_param_init(void);

uint8_t battery_add_obj(uint8_t idx,uint8_t channel,uint8_t addr);


/**
 * @brief 
 * 
 * @param in idx 
 * @return battery_attr_t ==NULL 查询出错,   !NULL 查询ok
 */
battery_attr_t*  battery_get_obj(uint8_t idx) ;  //battery_attr_get


/**
 * @brief battery_set_obj() 赋值节点数据
 * 
 * @param in idx
 * @param in p_attr
 * @return 0=失败，1=成功 
 */
uint8_t  battery_set_obj(uint8_t idx,battery_attr_t* p_attr )  ;



  //  battery_index_run_data_begin      = 0,    // 设备运行参数
  //  battery_index_config_data_begin   = 3,    // 设备配置参数
/**
 * @brief 根据下标，获取iot_id 的编号
 * 
 * @param idx 
 */
uint16_t  battery_get_iot_id(uint8_t idx);


/**
 * @brief 
 * 
 * @param attr_id 
 * @param attr_out 
 */
void battery_get_attr(uint8_t idx,uint16_t attr_id, IotModel* attr_out);


/**
 * @brief 
 * 
 * @param attr_in 
 * @return uint8_t 
 */
uint8_t battery_set_attr(uint8_t idx,IotModel* attr_in);


void battery_test_tick_min(uint8_t idx);

////刷新节点运行数据
void battery_update_tick_min(uint8_t idx,int8_t temper ,uint32_t battery );

void battery_obj_update(uint8_t idx,battery_attr_t* pliq_in  );




#endif //------__DEV_BATTERY_H__




















